var express = require('express');  //生成一个express实例 app
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var settings = require('./settings');  // 链接数据库

//express 也提供了会话中间件，默认情况下是把用户信息存储在内存中，但我们既然已经有了 MongoDB，不妨把会话信息存储在数据库中，便于持久维护。为了使用这一功能，我们需要借助 express-session 和 connect-mongo 这两个第三方中间件;
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
 //flash 是一个在 session 中用于存储信息的特定区域。信息写入 flash ，下一次显示完毕后即被清除。典型的应用是结合重定向的功能，确保信息是提供给下一个被渲染的页面。
var flash = require('connect-flash');


var routes = require('./routes/index');

var app = express();

app.set('port', process.env.PORT || 3000);    //设置端口号。
app.set('views', path.join(__dirname, 'views'));    //设置 views 文件夹为存放视图文件的目录, 即存放模板文件的地方,dirname 为全局变量,存储当前正在执行的脚本所在的目录。
app.set('view engine', 'ejs');   //设置视图模板引擎为 ejs
app.use(flash());   //


// 设置/public/favicon.ico为favicon图标
// app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));   //加载日志中间件
app.use(bodyParser.json());   //加载解析json的中间件。
app.use(bodyParser.urlencoded({ extended: false }));   //加载解析urlencoded请求体的中间件。
app.use(cookieParser());   //加载解析cookie的中间件。
app.use(express.static(path.join(__dirname, 'public')));   //设置public文件夹为存放静态文件的目录。
routes(app);
//使用 express-session 和 connect-mongo 模块实现了将会化信息存储到mongoldb中。secret 用来防止篡改 cookie，key 的值为 cookie 的名字，通过设置 cookie 的 maxAge 值设定 cookie 的生存期，这里我们设置 cookie 的生存期为 30 天，设置它的 store 参数为 MongoStore 实例，把会话信息存储到数据库中，以避免丢失。在后面的小节中，我们可以通过 req.session 获取当前用户的会话对象，获取用户的相关信息。
app.use(session({
  secret: settings.cookieSecret,
  key: settings.db,//cookie name
  cookie: {maxAge: 1000 * 60 * 60 * 24 * 30},//30 days
  store: new MongoStore({
    db: settings.db,
    host: settings.host,
    port: settings.port
  })
}));


app.listen(app.get('port'), function() {
  console.log('Express server listening on port ' + app.get('port'));
});

//路由控制器
// app.use('/', index);
// app.use('/users', users);

// 捕获404错误，并转发到错误处理器。
// app.use(function(req, res, next) {
//   var err = new Error('Not Found');
//   err.status = 404;
//   next(err);
// });

// 生产环境下的错误处理器，将错误信息渲染error模版并显示到浏览器中。
// app.use(function(err, req, res, next) {
//   // set locals, only providing error in development
//   res.locals.message = err.message;
//   res.locals.error = req.app.get('env') === 'development' ? err : {};
//
//   // render the error page
//   res.status(err.status || 500);
//   res.render('error');
// });


//导出app实例供其他模块调用。
// module.exports = app;
